package com.whcoding.test.common.list;

import com.google.common.collect.Iterables;
import org.apache.commons.collections.ListUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @program: whcoding
 * @description: 合并List
 * @author: whcoding
 * @create: 2021-02-22 14:05
 **/
public class ListMergeUtil {

	/**
	 * 合并List ListAddALL
	 *
	 * @param list1 待合并的List1
	 * @param list2 待合并的List2
	 * @param <T>   泛型
	 * @return
	 */
	public static <T> List<T> getMergeList(List<T> list1, List<T> list2) {
		List<T> mergeList = new ArrayList<>(list1);
		mergeList.addAll(list2);
		return mergeList;
	}


	/**
	 * 合并List ListAddALL
	 *
	 * @param list1 待合并的List1
	 * @param list2 待合并的List2
	 * @param <T>   泛型
	 * @return
	 */
	public static <T> List<T> getMergeList1(List<T> list1, List<T> list2) {
		return new ArrayList<T>() {{
			addAll(list1);
			addAll(list2);
		}};
	}


	/**
	 * 合并List Java8
	 *
	 * @param list1 待合并的List1
	 * @param list2 待合并的List2
	 * @param <T>   泛型
	 * @return
	 */
	public static <T> List<T> getMergeListForJava8(List<T> list1, List<T> list2) {
		return Stream.of(list1, list2).flatMap(x -> x.stream()).collect(Collectors.toList());
	}

	/**
	 * 合并List Java8
	 *
	 * @param list1 待合并的List1
	 * @param list2 待合并的List2
	 * @param <T>   泛型
	 * @return
	 */
	public static <T> List<T> getMergeList5(List<T> list1, List<T> list2) {
		List<T> list = new ArrayList<>();
		Stream.of(list1, list2).forEach(list::addAll);
		return list;
	}


	/**
	 * 合并List Stream.concat
	 *
	 * @param list1 待合并的List1
	 * @param list2 待合并的List2
	 * @param <T>   泛型
	 * @return
	 */
	public static <T> List<T> getMergeList6(List<T> list1, List<T> list2) {

		return Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList());
	}

	/**
	 * 合并List addAll
	 *
	 * @param list1 待合并的List1
	 * @param list2 待合并的List2
	 * @param <T>   泛型
	 * @return
	 */
	public static <T> List<T> getMergeList7(List<T> list1, List<T> list2) {

		List<T> list = list1.stream().collect(Collectors.toList());
		list.addAll(list2);
		return list;
	}


	/**
	 * 合并List collections
	 *
	 * @param list1 待合并的List1
	 * @param list2 待合并的List2
	 * @param <T>   泛型
	 * @return
	 */
	public static <T> List<T> getMergeList8(List<T> list1, List<T> list2) {

		return ListUtils.union(list1, list2);
	}


	/**
	 * 合并List collections
	 *
	 * @param list1 待合并的List1
	 * @param list2 待合并的List2
	 * @param <T>   泛型
	 * @return
	 */
	public static <T> List<T> getMergeList9(List<T> list1, List<T> list2) {
		List<T> list = new ArrayList<>();
		Iterables.addAll(list, list1);
		Iterables.addAll(list, list2);
		return list;
	}


}
